home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
haeberli
/
libgutil
/
sgiobjgl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
12KB
|
430 lines
/*
* Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
/*
* sgiobjgl -
* A simple object format - graphics support.
*
* Paul Haeberli - 1990
*/
#include "stdio.h"
#include "gl.h"
#include "device.h"
#include "sgiobj.h"
#include "spin.h"
static randcolor();
#define BYTEOFF(v) (sizeof(long)*(v))
static trilines(verts)
float *verts[3];
{
bgnclosedline();
v3f(verts[0]+OFFSET_POINT);
v3f(verts[1]+OFFSET_POINT);
v3f(verts[2]+OFFSET_POINT);
endclosedline();
}
drawsgiobj(obj,how)
sgiobj *obj;
int how;
{
long npolys;
long *data;
char *vertdata, *avert;
int vertlongs, nverts;
data = obj->data;
if(obj->objtype == OBJ_QUADLIST) {
npolys = (obj->nlongs/PNTLONGS)/4;
switch(how) {
case DRAW_LINES:
while(npolys--) {
bgnclosedline();
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
endclosedline();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS:
while(npolys--) {
bgntmesh();
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*3)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS|DRAW_UVS:
while(npolys--) {
bgntmesh();
myt2f((float*)&data[(PNTLONGS*0)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*1)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*3)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*2)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS|DRAW_UVS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
myt2f((float*)&data[(PNTLONGS*0)+OFFSET_UVS]);
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*1)+OFFSET_UVS]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*3)+OFFSET_UVS]);
n3f((float*)&data[(PNTLONGS*3)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*2)+OFFSET_UVS]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS|DRAW_COLORS:
while(npolys--) {
bgntmesh();
c3f((float*)&data[(PNTLONGS*0)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*1)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*3)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*2)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
case DRAW_POINTS|DRAW_COLORS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
c3f((float*)&data[(PNTLONGS*0)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*1)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*3)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*3)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*3)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*2)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*4;
}
break;
}
} else if(obj->objtype == OBJ_TRILIST) {
npolys = (obj->nlongs/PNTLONGS)/3;
switch(how) {
case DRAW_LINES:
while(npolys--) {
bgnclosedline();
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endclosedline();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS:
while(npolys--) {
bgntmesh();
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS|DRAW_UVS:
while(npolys--) {
bgntmesh();
myt2f((float*)&data[(PNTLONGS*0)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
myt2f((float*)(float*)&data[(PNTLONGS*1)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
myt2f((float*)&data[(PNTLONGS*2)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS|DRAW_UVS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
myt2f((float*)&data[(PNTLONGS*0)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
myt2f((float*)&data[(PNTLONGS*1)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
myt2f((float*)&data[(PNTLONGS*2)+OFFSET_UVS]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS|DRAW_COLORS:
while(npolys--) {
bgntmesh();
c3f((float*)&data[(PNTLONGS*0)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*1)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*2)+OFFSET_COLOR]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
case DRAW_POINTS|DRAW_COLORS|DRAW_NORMALS:
while(npolys--) {
bgntmesh();
c3f((float*)&data[(PNTLONGS*0)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*0)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*0)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*1)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*1)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*1)+OFFSET_POINT]);
c3f((float*)&data[(PNTLONGS*2)+OFFSET_COLOR]);
n3f((float*)&data[(PNTLONGS*2)+OFFSET_NORMAL]);
v3f((float*)&data[(PNTLONGS*2)+OFFSET_POINT]);
endtmesh();
data += PNTLONGS*3;
}
break;
}
} else if(obj->objtype == OBJ_TRIMESH) {
if(how == DRAW_LINES)
applytomeshtris(obj,trilines);
else {
vertlongs = *data++;
vertdata = (char *)data;
data += vertlongs;
while(1) {
switch(*data++) {
case OP_BGNTMESH:
bgntmesh();
break;
case OP_SWAPTMESH:
swaptmesh();
break;
case OP_ENDBGNTMESH:
endtmesh();
bgntmesh();
break;
case OP_ENDTMESH:
endtmesh();
return;
default:
fprintf(stderr,"drawsgiobj: bad tmesh op %d\n",*data);
exit(1);
}
nverts = *data++;
switch(how) {
case DRAW_POINTS:
while(nverts--) {
avert = vertdata + *data++;
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
break;
case DRAW_POINTS|DRAW_NORMALS:
while(nverts--) {
avert = vertdata + *data++;
n3f((float*)(avert+BYTEOFF(OFFSET_NORMAL)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
break;
case DRAW_POINTS|DRAW_UVS:
while(nverts--) {
avert = vertdata + *data++;
myt2f((float*)(avert+BYTEOFF(OFFSET_UVS)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
break;
case DRAW_POINTS|DRAW_UVS|DRAW_NORMALS:
while(nverts--) {
avert = vertdata + *data++;
myt2f((float*)(avert+BYTEOFF(OFFSET_UVS)));
n3f((float*)(avert+BYTEOFF(OFFSET_NORMAL)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
break;
case DRAW_POINTS|DRAW_COLORS:
while(nverts--) {
avert = vertdata + *data++;
c3f((float*)(avert+BYTEOFF(OFFSET_COLOR)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
break;
case DRAW_POINTS|DRAW_COLORS|DRAW_NORMALS:
while(nverts--) {
avert = vertdata + *data++;
c3f((float*)(avert+BYTEOFF(OFFSET_COLOR)));
n3f((float*)(avert+BYTEOFF(OFFSET_NORMAL)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
}
}
}
} else {
fprintf(stderr,"drawsgiobj: bad object type %d\n",obj->objtype);
exit(1);
}
}
/*
* show normals on an sgi object
*
*
*/
#define NSCALE 0.020
static drawnorm(p)
float *p;
{
float p2[3];
p2[0] = p[OFFSET_POINT+0]+NSCALE*p[OFFSET_NORMAL+0];
p2[1] = p[OFFSET_POINT+1]+NSCALE*p[OFFSET_NORMAL+1];
p2[2] = p[OFFSET_POINT+2]+NSCALE*p[OFFSET_NORMAL+2];
bgnline();
v3f(p+OFFSET_POINT);
v3f(p2);
endline();
}
drawsgiobjnorms(obj)
sgiobj *obj;
{
applytoverts(obj,drawnorm);
}
/*
* show tri meshes in an sgi object
*
*
*/
drawsgiobjmeshs(obj)
sgiobj *obj;
{
long npolys;
long *data;
char *vertdata, *avert;
int vertlongs, nverts;
data = obj->data;
if(obj->objtype == OBJ_QUADLIST) {
fprintf(stderr,"drawsgiobjtmesh: can't draw QUADLISTS\n");
return;
} else if(obj->objtype == OBJ_TRILIST) {
fprintf(stderr,"drawsgiobjtmesh: can't draw TRILISTS\n");
return;
} else if(obj->objtype == OBJ_TRIMESH) {
vertlongs = *data++;
vertdata = (char *)data;
data += vertlongs;
while(1) {
switch(*data++) {
case OP_BGNTMESH:
randcolor();
bgntmesh();
break;
case OP_SWAPTMESH:
swaptmesh();
break;
case OP_ENDBGNTMESH:
endtmesh();
randcolor();
bgntmesh();
break;
case OP_ENDTMESH:
endtmesh();
return;
default:
fprintf(stderr,"drawsgiobjtmesh: bad tmesh op %d\n",*data);
exit(1);
}
nverts = *data++;
while(nverts--) {
avert = vertdata + *data++;
n3f((float*)(avert+BYTEOFF(OFFSET_NORMAL)));
v3f((float*)(avert+BYTEOFF(OFFSET_POINT)));
}
}
} else {
fprintf(stderr,"drawsgiobjtmesh: bad object type %d\n",obj->objtype);
exit(1);
}
}
static randcolor()
{
int r, g, b;
r = rand()&0xff;
g = rand()&0xff;
b = rand()&0xff;
cpack((b<<16)+(g<<8)+(r<<0));
}